/**
 * DisposableBean适配器类，用于在不同情况下调用Bean的销毁方法
 * 当Bean实现了DisposableBean接口或定义了自定义销毁方法时，本适配器类可以确保销毁方法被正确调用
 */
package com.test.adapter;

import com.test.bean.DisposableBean;
import com.test.exception.BeansException;

import java.lang.reflect.Method;

/**
 * DisposableBeanAdapter类实现DisposableBean接口，用于适配并调用目标Bean的销毁方法
 */
public class DisposableBeanAdapter implements DisposableBean {

    // 目标Bean实例
    private final Object bean;
    // Bean名称，用于日志和错误信息
    private final String beanName;
    // 自定义销毁方法名称
    private final String destroyMethodName;

    /**
     * 构造函数，初始化DisposableBeanAdapter实例
     *
     * @param bean 目标Bean实例
     * @param beanName Bean名称，用于日志和错误信息
     * @param destroyMethodName 自定义销毁方法名称
     */
    public DisposableBeanAdapter(Object bean, String beanName, String destroyMethodName) {
        this.bean = bean;
        this.beanName = beanName;
        this.destroyMethodName = destroyMethodName;
    }

    /**
     * 调用目标Bean的销毁方法
     * 如果Bean实现了DisposableBean接口，则调用其destroy方法
     * 如果Bean定义了自定义销毁方法，则调用该自定义方法
     *
     * @throws Exception 如果销毁方法调用失败
     */
    @Override
    public void destroy() throws Exception {
        // 如果Bean实现了DisposableBean接口，则调用其destroy方法
        if (bean instanceof DisposableBean){
            ((DisposableBean) bean).destroy();
            System.out.println("执行bean [" + beanName + "] 的DisposableBean接口的destroy方法");
        }
        // 如果定义了自定义销毁方法且不与DisposableBean接口的destroy方法重复，则调用自定义销毁方法
        if (destroyMethodName != null && !(bean instanceof DisposableBean && "destroy".equals(this.destroyMethodName))){
            try{
                // 获取并调用自定义销毁方法
                Method destroyMethod = bean.getClass().getMethod(destroyMethodName);
                destroyMethod.invoke(bean);
                System.out.println("执行bean [" + beanName + "] 的自定义销毁方法：" + destroyMethodName);
            }catch (NoSuchMethodException e){
                // 如果找不到自定义销毁方法，抛出BeansException异常
                throw new BeansException("找不到Bean[" + beanName + "]的销毁方法：" + destroyMethodName, e);
            }catch (Exception e){
                // 如果调用自定义销毁方法失败，抛出BeansException异常
                throw new BeansException("执行bean [" + beanName + "] 的自定义销毁方法：" + destroyMethodName + "失败", e);
            }
        }
    }
}
